package com.ruoyi.business.vo;

import com.ruoyi.business.domain.BuyerInfo;
import lombok.AllArgsConstructor;
import lombok.Data;

import java.util.List;

/**
 * @Author ty
 * @Date 2025-07-16
 */
@Data
public class SendOrderInfoVo {
    //买家信息
    private BuyerInfo buyerInfo;
    //配送信息
    private DeliveryInfo deliveryInfo;
    //订单基本信息
    private OrderBaseInfo orderBaseInfo;
    //订单项列表
    private List<ItemInfo> itemInfoList;
    //商家信息
    private MerchantInfo merchantInfo;
    //支付明细信息
    private List<PaymentDetail> paymentDetails;
    //支付信息
    private PayInfo payInfo;

    @Data
    public static class DeliveryInfo {
        private SendInfo sendInfo;//发货方信息
        private Integer deliveryType;//1-物流配送（快递发货）；2-同城限时达（即时物流）；3-到店自提（自提流程）；5-无需物流（此时 deliveryInfo 下其他字段可不传
        private ReceiveInfo receiveInfo;//收货方信息
    }

    @Data
    public static class SendInfo {
        private SenderInfo senderInfo;//发货人信息
        private Long processVid;//操作门店的组织 ID
        private String processVidName;//操作门店名称
    }

    @Data
    public static class SenderInfo {
        private String senderName;//发货人名称
        private String senderMobile;//发货人电话
    }

    @Data
    public static class ReceiveInfo {
        private AddressInfo addressInfo;//收货地址信息
        private ReceiverInfo receiverInfo;//收货人信息
    }

    @Data
    public static class AddressInfo {
        private String address;//详细地址
        private String province;//省份
        private String city;//城市
        private String county;//区/县
    }

    @Data
    public static class ReceiverInfo {
        private String receiverName;//收货人名称
        private String receiverMobile;//收货人电话
    }

    @Data
    public static class OrderBaseInfo {
        private List<TimeItem> timeList;//订单各状态的时间集合
        private Integer payType;//1-线上支付；2-线下支付
        private Long payTime;//支付完成时间，格式为毫秒级时间戳
        private Integer orderStatus;//订单状态：0-创建；1-部分支付；2-已支付；3-待发货；4-部分发货；5-已发货；7-确认收货；8-完成（订单已确认收货且过了售后期）；9-取消
        private Integer channelType;//280-CPS导入订单
        private String outerOrderNo;//外部订单号
        private Integer payStatus;//0-未支付；1-部分支付；2-已支付
        private Integer bizSourceType;//订单业务来源:1-普通订单；2-商户助手APP；3-收银台；4-扫码购
        private Integer saleChannelType;//销售渠道类型:10001-线上网店；10002-线下门店
    }

    @Data
    @AllArgsConstructor
    public static class TimeItem {
        /**
         * 101-订单创建时间；102-支付完成时间；103-可发货时间；104-订单首次发货时间；105-发货完成时间；106-确认收货时间；107-订单完成时间；108-订单取消时间
         * 当 orderStatus=5（已发货）时，timelist 中需传入 101~105 的值
         */
        private Integer type;
        private Long value;//时间，格式为毫秒级时间戳
    }

    @Data
    public static class PayInfo {
        private String totalAmount;//总金额，单位为元，精确到两位小数
        private String shouldPayAmount;//应付金额
        private String payAmount;//实付金额
    }

    @Data
    public static class ItemInfo {
        private String outItemId;//外部订单项 ID
        private PayInfo payInfo;//支付信息，同订单级
        private GoodsInfo goodsInfo;//商品信息
        private List<DiscountInfo> discountInfoList;//折扣活动列表
    }
    @Data
    public static class DiscountInfo {
        private Integer discountLevel;//折扣活动层级:0-商品级；1-运费；2-订单级；3-包装费；10-发票税费
        private DiscountExt discountExt;//折扣拓展信息
        private String discountAmount;//折扣金额，以元为单位，精确到两位小数
        private Integer discountType;//折扣活动类型:29-抹零
    }
    @Data
    @AllArgsConstructor
    public static class DiscountExt{
        private String participate;//0-不参与计算；1-参与计算
        private Integer attributionType;//折扣类型:1-优惠减免；2-优惠抵扣；3-订单改价
    }

    @Data
    public static class GoodsInfo {
        private String salePrice;//商品销售价格
        private Integer goodsSellMode;//商品销售模式:1-普通 ；2-预售
        private Long skuId;//商品规格 SKU 的 ID，需全局唯一
        private String skuNum;//商品数量，按照实际买家下单数量传入
        private String skuCode;//规格编码，需全局唯一,skuId 与 skuCode 可二选一传入
        private Integer categoryId;//商品类目ID
    }

    @Data
    public static class MerchantInfo {
        private Long vid;//销售组织的 ID
        private String bosName;//商户名称
        private Integer processVidType;//服务组织的类型:0-无类型，无业务意义；1-集团；2-品牌；3-区域；5-商场；10-门店；100-自提点
        private Long processVid;//服务组织的 ID
        private Integer vidType;//销售组织的类型:1-集团；2-品牌；5-商场；10-门店
        private String processVidName;//服务组织的名称
    }

    @Data
    public static class PaymentDetail {
        private Integer phase;//支付阶段:3-全款
        private Long payTime;//支付时间，格式为毫秒级时间戳
        private List<Integer> payMethodIds;//支付方式 ID列表 :1-支付宝；2-微信支付；3-银行卡；4-现金；5-线下支付；
    }
}

